package com.syg.jvm;

import java.util.ArrayList;
import java.util.List;

public class OOMObject {

    /**
     * 为快速发生oom，设置堆大小; VM args: -Xms20m -Xmx20m
     *
     * 此实验证明：发生oom,jvm也不一定会退出
     *
     * 示例没有导致JVM退出的原因在于，线程通过往局部变量集合中不断加入对象，产生OOM。线程因异常退出后，集合中的对象由于引用不可达，会被gc，这样就有了足够的堆内存供其他线程使用
     * 假如示例中的list是一个“全局”的类static变量，那么即使线程退出，内存也得不到释放。这时其他线程如果不断再申请堆内存资源，就会造成连锁反应导致JVM退出。
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        new Thread(() -> {
            try {
                List<OOMObject> list = new ArrayList<>();
                while (true) {
                    list.add(new OOMObject());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

        }).start();

        while (true) {
            System.out.println(Thread.currentThread().getName() + " continuing...");
            Thread.sleep(1000L);
        }
    }
}
